package com.smile.frame.springbootsatoken.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.dev33.satoken.stp.parameter.enums.SaLogoutMode;
import cn.dev33.satoken.stp.parameter.enums.SaReplacedRange;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    // 测试登录，浏览器访问： http://localhost:8081/user/doLogin?username=admin&password=admin
    @RequestMapping("/doLogin")
    public SaResult doLogin(String username, String password) {
        SaTokenInfo tokenInfo = null;
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对 
        if ("admin".equals(username) && "admin".equals(password)) {

//            StpUtil.login(10001, new SaLoginParameter()
//                    .setDeviceType("PC")             // 此次登录的客户端设备类型, 一般用于完成 [同端互斥登录] 功能
//                    .setDeviceId("xxxxxxxxx")        // 此次登录的客户端设备ID, 登录成功后该设备将标记为可信任设备
//                    .setIsLastingCookie(true)        // 是否为持久Cookie（临时Cookie在浏览器关闭时会自动删除，持久Cookie在重新打开后依然存在）
//                    .setTimeout(60 * 60 * 24 * 7)    // 指定此次登录 token 的有效期, 单位:秒，-1=永久有效
//                    .setActiveTimeout(60 * 60 * 24 * 7) // 指定此次登录 token 的最低活跃频率, 单位:秒，-1=不进行活跃检查
//                    .setIsConcurrent(true)           // 是否允许同一账号多地同时登录 （为 true 时允许一起登录, 为 false 时新登录挤掉旧登录）
//                    .setIsShare(false)                // 在多人登录同一账号时，是否共用一个 token （为 true 时所有登录共用一个token, 为 false 时每次登录新建一个 token）
//                    .setMaxLoginCount(12)            // 同一账号最大登录数量，-1代表不限 （只有在 isConcurrent=true, isShare=false 时此配置项才有意义）
//                    .setMaxTryTimes(12)              // 在每次创建 token 时的最高循环次数，用于保证 token 唯一性（-1=不循环尝试，直接使用）
//                    .setExtra("key", "value")        // 记录在 Token 上的扩展参数（只在 jwt 模式下生效）
//                    .setToken("xxxx-xxxx-xxxx-xxxx") // 预定此次登录的生成的Token
//                    .setIsWriteHeader(false)         // 是否在登录后将 Token 写入到响应头
//                    .setTerminalExtra("key", "value")// 本次登录挂载到 SaTerminalInfo 的自定义扩展数据
//                    .setReplacedRange(SaReplacedRange.CURR_DEVICE_TYPE) // 顶人下线的范围: CURR_DEVICE_TYPE=当前指定的设备类型端, ALL_DEVICE_TYPE=所有设备类型端
//                    .setOverflowLogoutMode(SaLogoutMode.LOGOUT)         // 溢出 maxLoginCount 的客户端，将以何种方式注销下线: LOGOUT=注销下线, KICKOUT=踢人下线, REPLACED=顶人下线
//                    .setRightNowCreateTokenSession(true)                // 是否立即创建对应的 Token-Session （true=在登录时立即创建，false=在第一次调用 getTokenSession() 时创建）
//                    .setupCookieConfig(cookie->{     // 设置 Cookie 配置项
//                                cookie.setDomain("sa-token.cc");  // 设置：作用域
//                                cookie.setPath("/shop");          // 设置：路径 （一般只有当你在一个域名下部署多个项目时才会用到此值。）
//                                cookie.setSecure(true);           // 设置：是否只在 https 协议下有效
//                                cookie.setHttpOnly(true);         // 设置：是否禁止 js 操作 Cookie
//                                cookie.setSameSite("Lax");        // 设置：第三方限制级别（Strict=完全禁止，Lax=部分允许，None=不限制）
//                                cookie.addExtraAttr("aa", "bb");  // 设置：额外扩展属性
//                            }
//                    ));


            StpUtil.login(10001);
            // 第2步，获取 Token  相关参数
            tokenInfo = StpUtil.getTokenInfo();

            log.info("token信息：{}", tokenInfo);

            StpUtil.getTokenSessionByToken(tokenInfo.getTokenValue()).get("userInfo", "[1,2,3,4]");
//            StpUtil.getSessionByLoginId()
            StpUtil.logout();
        }
        return SaResult.data(tokenInfo);
    }

    // 查询登录状态，浏览器访问： http://localhost:8081/user/isLogin
    @SaCheckPermission(value = {"user:get"})
    @RequestMapping("/isLogin")
    public String isLogin() {
        SaSession tokenSession = StpUtil.getTokenSession();
        log.info("tokenSession信息:{}", JSONUtil.toJsonStr(tokenSession));

        log.info("tokenSession userinfo信息:{}", JSONUtil.toJsonStr(tokenSession));
        return "当前会话是否登录：" + StpUtil.isLogin();
    }

    @SaCheckPermission(value = {"user:add"})
    @RequestMapping("/add")
    public SaResult add() {
        SaSession tokenSession = StpUtil.getTokenSession();
        log.info("tokenSession信息:{}", tokenSession);
        return SaResult.data(tokenSession);
    }

}
